/*********************************************************************************************************************
 * COPYRIGHT NOTICE
 * Copyright (c) 2018,逐飞科技
 * All rights reserved.
 * 技术讨论QQ群：	一群：179029047(已满)
 *					二群：244861897(已满)
 *					三群：824575535
 *
 * 以下所有内容版权均属逐飞科技所有，未经允许不得用于商业用途，
 * 欢迎各位使用并传播本程序，修改内容时必须保留逐飞科技的版权声明。
 *
 * @file			zf_spi.h
 * @company			成都逐飞科技有限公司
 * @author			逐飞科技(QQ3184284598)
 * @version			查看doc内version文件 版本说明
 * @Software		IAR 8.3 or MDK 5.24
 * @Taobao			https://seekfree.taobao.com/
 * @date			2020-03-25
 * @note			本文件作为 LPC55S 系列芯片开源库外设文件
					提供 SPI 外设驱动
 ********************************************************************************************************************/
#ifndef _ZF_SPI_H_
#define _ZF_SPI_H_

#ifdef RT_THREAD												// 如果启用了 RT-Thread OS
#include <rthw.h>
#include <rtthread.h>
#endif

#include "zf_flexcomm.h"

// *********************************************************** Param define *********************************************************** start
//====================== SPI SSEL Index ======================
typedef enum
{
	SPI_SSEL0 = 0x00U,											// 选项 0 对应 SSEL0
	SPI_SSEL1,													// 选项 1 对应 SSEL1
	SPI_SSEL2,													// 选项 2 对应 SSEL2
	SPI_SSEL3													// 选项 3 对应 SSEL3
}spi_ssel_list;
//====================== SPI SSEL Index ======================

// ========== SPI MASTER 参数对应选项 ==========
typedef enum
{
	SPI_MASTER_PARAM_LOOP_BACK = 0x00,							// 测试数据回环回调
	SPI_MASTER_PARAM_MASTER_ENABLE,								// 主机使能
	SPI_MASTER_PARAM_CLOCK_POLARITY,							// 时钟极性
	SPI_MASTER_PARAM_CLOCK_PHASE,								// 时钟相位
	SPI_MASTER_PARAM_DATA_DIRECTION,							// SPI 数据排列方向 MSB/LSB
	SPI_MASTER_PARAM_BAUD_RATE,									// SPI 数据传输波特率
	SPI_MASTER_PARAM_DATA_WIDTH,								// SPI 单个数据长度
	SPI_MASTER_PARAM_SSEL_SELECT,								// 从机选择
	SPI_MASTER_PARAM_SSEL_POLARITY,								// 从机有效电平
	SPI_MASTER_PARAM_TX_FIFO,									// TX 缓冲区触发级数
	SPI_MASTER_PARAM_RX_FIFO,									// RX 缓冲区触发级数
	SPI_MASTER_PARAM_DELAY_PRE,									// 断言与传输之间的延时
	SPI_MASTER_PARAM_DELAY_POST,								// 传输结束与从机终止之间的延时
	SPI_MASTER_PARAM_DELAY_FRAME,								// 帧延时
	SPI_MASTER_PARAM_DELAY_TRANSFER								// 传输延时
}spi_master_param_list;
// ========== SPI MASTER 参数对应选项 ==========

// ========== SPI SLAVE 参数对应选项 ==========
typedef enum
{
	SPI_SLAVE_PARAM_SLAVE_ENABLE= 0x00,							// 从机使能
	SPI_SLAVE_PARAM_CLOCK_POLARITY,								// 时钟极性
	SPI_SLAVE_PARAM_CLOCK_PHASE,								// 时钟相位
	SPI_SLAVE_PARAM_DATA_DIRECTION,								// SPI 数据排列方向 MSB/LSB
	SPI_SLAVE_PARAM_DATA_WIDTH,									// SPI 单个数据长度
	SPI_SLAVE_PARAM_SSEL_POLARITY,								// 从机有效电平
	SPI_SLAVE_PARAM_TX_FIFO,									// TX 缓冲区触发级数
	SPI_SLAVE_PARAM_RX_FIFO,									// RX 缓冲区触发级数
}spi_slave_param_list;
// ========== SPI SLAVE 参数对应选项 ==========

// ========== SPI 测试环路选项 ==========
typedef enum
{
	SPI_LOOP_BACK_DISANBLE = 0X00,
	SPI_LOOP_BACK_ENABLE
}spi_loop_back_list;
// ========== SPI 测试环路选项 ==========

// ========== SPI 时钟极性选项 ==========
typedef enum
{
	SPI_CLOCK_POLARITY_HIGH_VALID = 0X00,
	SPI_CLOCK_POLARITY_LOW_VALID
}spi_clock_polarity_list;
// ========== SPI 时钟极性选项 ==========

// ========== SPI 时钟相位选项 ==========
typedef enum
{
	SPI_CLOCK_PHASE_FIRST_EDGE = 0X00,
	SPI_CLOCK_PHASE_SECOND_EDGE
}spi_clock_phase_list;
// ========== SPI 时钟相位选项 ==========

// ========== SPI 数据方向选项 ==========
typedef enum
{
	SPI_DATA_DIRECTION_MSB_FIRST = 0X00,
	SPI_DATA_DIRECTION_LSB_FIRST
}spi_data_direction_list;
// ========== SPI 数据方向选项 ==========

// ========== SPI 单个数据长度 ==========
typedef enum
{
	SPI_DATA_SIZE_04_BIT = 0x0003U,								// 选项  0 对应  4BIT 数据
	SPI_DATA_SIZE_05_BIT,										// 选项  1 对应  5BIT 数据
	SPI_DATA_SIZE_06_BIT,										// 选项  2 对应  6BIT 数据
	SPI_DATA_SIZE_07_BIT,										// 选项  3 对应  7BIT 数据
	SPI_DATA_SIZE_08_BIT,										// 选项  4 对应  8BIT 数据
	SPI_DATA_SIZE_09_BIT,										// 选项  5 对应  9BIT 数据
	SPI_DATA_SIZE_10_BIT,										// 选项  6 对应 10BIT 数据
	SPI_DATA_SIZE_11_BIT,										// 选项  7 对应 11BIT 数据
	SPI_DATA_SIZE_12_BIT,										// 选项  8 对应 12BIT 数据
	SPI_DATA_SIZE_13_BIT,										// 选项  9 对应 13BIT 数据
	SPI_DATA_SIZE_14_BIT,										// 选项 10 对应 14BIT 数据
	SPI_DATA_SIZE_15_BIT,										// 选项 11 对应 15BIT 数据
	SPI_DATA_SIZE_16_BIT										// 选项 12 对应 16BIT 数据
}spi_data_size_list;
// ========== SPI 单个数据长度 ==========

// ========== SPI 从机有效选项 ==========
typedef enum
{
	SPI_SSEL_POLARITY_ALL_LOW = 0x00,
	SPI_SSEL_POLARITY_SSEL0_HIGH = 0x100,
	SPI_SSEL_POLARITY_SSEL1_HIGH = 0x200,
	SPI_SSEL_POLARITY_SSEL2_HIGH = 0x400,
	SPI_SSEL_POLARITY_SSEL3_HIGH = 0x800,
	SPI_SSEL_POLARITY_ALL_HIGH = 0xF00,
}spi_ssel_polatity_list;
// ========== SPI 从机有效选项 ==========

// ========== SPI TXFIFO 级数选项 ==========
typedef enum
{
	SPI_TX_FIFO_0_ENTRIE  = 0x00,
	SPI_TX_FIFO_1_ENTRIE,
	SPI_TX_FIFO_2_ENTRIE,
	SPI_TX_FIFO_3_ENTRIE,
	SPI_TX_FIFO_4_ENTRIE,
	SPI_TX_FIFO_5_ENTRIE,
	SPI_TX_FIFO_6_ENTRIE,
	SPI_TX_FIFO_7_ENTRIE,
}spi_tx_fifo_list;
// ========== SPI TXFIFO 级数选项 ==========

// ========== SPI RXFIFO 级数选项 ==========
typedef enum
{
	SPI_RX_FIFO_1_ENTRIE  = 0x00,
	SPI_RX_FIFO_2_ENTRIE,
	SPI_RX_FIFO_3_ENTRIE,
	SPI_RX_FIFO_4_ENTRIE,
	SPI_RX_FIFO_5_ENTRIE,
	SPI_RX_FIFO_6_ENTRIE,
	SPI_RX_FIFO_7_ENTRIE,
	SPI_RX_FIFO_8_ENTRIE,
}spi_rx_fifo_list;
// ========== SPI RXFIFO 级数选项 ==========

// ========== SPI 中断触发选项 ==========
typedef enum
{
	SPI_INTERRUPT_MODE_TXERR = 0X01,
	SPI_INTERRUPT_MODE_RXERR = 0X02,
	SPI_INTERRUPT_MODE_TXLVL = 0X04,
	SPI_INTERRUPT_MODE_RXLVL = 0X08,
}spi_interrupt_mode_list;
// ========== SPI 中断触发选项 ==========

// ========== SPI 发送配置选项 ==========
typedef enum
{
	SPI_FIFO_WIRTE_NOP = 0X0000,
	SPI_FIFO_WIRTE_EOT = 0X0010,
	SPI_FIFO_WIRTE_EOF = 0X0020,
	SPI_FIFO_WIRTE_RXIGNORE = 0X0040,
	SPI_FIFO_WIRTE_TXIGNORE = 0X0080,
}spi_fifo_wirte_list;
// ========== SPI 发送配置选项 ==========

// ========== SPI FIFO状态 ==========
typedef enum
{
	SPI_FIFO_STATUS_TXERR = 0X01,
	SPI_FIFO_STATUS_RXERR = 0X02,
	SPI_FIFO_STATUS_PERINT = 0X08,
	SPI_FIFO_STATUS_TXEMPTY = 0X10,
	SPI_FIFO_STATUS_TXNOTFULL = 0X20,
	SPI_FIFO_STATUS_RXNOTEMPTY = 0X40,
	SPI_FIFO_STATUS_RXFULL = 0X80,
}spi_fifo_status_list;
// ========== SPI FIFO状态 ==========

// *********************************************************** Param define *********************************************************** end

//extern spi_master_handle_t spi_transfer_handle[8];
//extern spi_config_t g_spi_data_config[8];
//extern spi_transfer_t g_spi_transfer_t[8];

#define		zf_spi_empty_txfifo(x)				spi_index[x]->FIFOCFG |= 0x00010000
#define		zf_spi_empty_rxfifo(x)				spi_index[x]->FIFOCFG |= 0x00020000

// ******************************************************** Function statement ******************************************************** start

//=================== Flex COMM SPI config ===================

void		zf_spi_master_get_default_config	(spi_master_config_t *config );
void		zf_spi_master_param_set				(spi_master_config_t *config, spi_master_param_list param_index, uint32_t data );
void		zf_spi_master_set_spi_dataformat	(flexcomm_index_list index, spi_master_config_t *config );
void		zf_spi_slave_get_default_config		(spi_slave_config_t *config );
void		zf_spi_slave_param_set				(spi_slave_config_t *config, spi_slave_param_list param_index, uint32_t data );
void		zf_spi_slave_set_spi_dataformat		(flexcomm_index_list index, spi_slave_config_t *config );
void		zf_spi_interrupt_enable				(flexcomm_index_list index, void handler(void) );
void		zf_spi_interrupt_disable			(flexcomm_index_list index );
void		zf_spi_interrupt_mode_set			(flexcomm_index_list index, uint8_t interrput_mode );
void		zf_spi_transfer_great_handle		(flexcomm_index_list index, spi_master_callback_t callback );
uint32_t	zf_spi_get_fifo_status				(flexcomm_index_list index );
uint8_t		zf_spi_get_fifo_TXLVL				(flexcomm_index_list index );
uint8_t		zf_spi_get_fifo_RXLVL				(flexcomm_index_list index );
//=================== Flex COMM SPI config ===================

//================== Flex COMM SPI function ==================
void		zf_spi_master_write_blocking		(flexcomm_index_list index, uint16_t *data, uint16_t datalen );
void		zf_spi_master_read_blocking			(flexcomm_index_list index, uint16_t *data, uint16_t datalen );
void		zf_spi_master_transfer_blocking		(flexcomm_index_list index, uint16_t *dataout, uint16_t *datain, uint16_t datalen );
void		zf_spi_slave_write_blocking			(flexcomm_index_list index, uint16_t *data, uint16_t datalen );
void		zf_spi_slave_transfer_blocking		(flexcomm_index_list flexCommIndex, uint16_t *dataout, uint16_t *datain, uint16_t datalen);
void		zf_spi_slave_write_lock				(flexcomm_index_list index );
uint8_t		zf_spi_read_fifo					(flexcomm_index_list index, uint16_t *data );
uint16_t	zf_spi_read_data					(flexcomm_index_list index );
void		zf_spi_master_write_data			(flexcomm_index_list index, uint16_t data, uint16_t config );
void		zf_spi_slave_write_data				(flexcomm_index_list index, uint16_t data, uint16_t config );
void		zf_spi_transfer_non_blocking		(flexcomm_index_list index, uint8_t *dataout, uint8_t *datain, uint8_t datalen );
//================== Flex COMM SPI function ==================

// ******************************************************** Function statement ******************************************************** end


#endif
